home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / CHASM.LZH / COM2DATA.ASM < prev    next >
Assembly Source File  |  1985-04-03  |  11KB  |  282 lines

  1. ;======================================================
  2. ; COM2DATA  release 2.0
  3. ; (c) 1984 by David Whitman
  4. ;
  5. ; High speed DOS 2.0 filter version
  6. ; of file conversion utility.
  7. ;
  8. ; Reads a COM file from STDIN and
  9. ; writes BASIC data statements to STDOUT
  10. ;
  11. ; Syntax:  COM2DATA [<filename] [>filename] [linenumber]
  12. ;
  13. ; The starting line number defaults to 1000 unless a number
  14. ; is given on the command line.
  15. ;
  16. ; Requires DOS 2.0, will abort under earlier versions.
  17. ;
  18. ; This source file is in CHASM assembler syntax.
  19. ;======================================================
  20.  
  21.  
  22. @dosver        equ     30H             ;get dos version #
  23. @prnchr        equ     02H             ;print character
  24. @prnstr        equ     09H             ;print string
  25. @read          equ     3FH             ;read device
  26. @write         equ     40H             ;write device
  27.  
  28. beep           equ     07H             ;bell character
  29. lf             equ     0AH             ;line feed character
  30. cr             equ     0DH             ;carrage return character
  31. comma          equ     2CH             ;comma character
  32. param_count    equ     [80H]           ;number of chars in param_area
  33. param_area     equ     [81H]           ;command line parameter text
  34. stdin          equ     0000H           ;standard input device
  35. stdout         equ     0001H           ;standard output device
  36. stderror       equ     0002H           ;standard error output device
  37. buf_length     equ     512             ;input buffer size
  38.  
  39. com2data       proc    near
  40.                call    init            ;check dos, print title
  41.                call    get_linenum     ;get starting line number
  42.                call    doit            ;run conversion
  43.                call    cleanup         ;final processing
  44.                int     20H             ;return to dos
  45.                endp
  46.  
  47. init           proc    near            ;initialization routine
  48.                mov     ah, @dosver     ;what dos are we under?
  49.                int     21H
  50.                cmp     al,2            ;dos 2.0 or over?
  51.                jae     a1              ;yes, skip
  52.  
  53.                mov     ah, @prnstr     ;no, bitch
  54.                mov     dx, offset(baddos)
  55.                int     21H
  56.                pop     ax              ;reset stack
  57.                int     20              ;and exit
  58.  
  59. a1             mov     ah, @write      ;send title message
  60.                mov     bx, stderror    ;to stderror
  61.                mov     cx, title_msg_end-title_msg
  62.                mov     dx, offset(title_msg)
  63.                int     21H
  64.                ret
  65.  
  66. baddos         db      beep cr lf
  67.                db      'This program requires DOS 2.0!' cr lf
  68.                db      cr lf '$'
  69.  
  70.  
  71. title_msg      db      cr lf
  72.                db      'COM2DATA version 2.0' cr lf
  73.                db      'Copyright (c) 1984 by D. Whitman' cr lf
  74.                db      cr lf
  75. title_msg_end
  76.                endp
  77.  
  78. get_linenum    proc     near           ;parse command line for
  79.                                        ;starting line number
  80.                xor     ch,ch           ;cx <== # of param chars
  81.                mov     cl, param_count ;   "
  82.                cmp     cl, 0           ;any parameters?
  83.                je      b1              ;no, exit with default
  84.  
  85.                mov     di, offset(param_area)
  86.                mov     al, ' '         ;search for first non-blank
  87.                rep
  88.                scasb
  89.                jcxz    b1              ;nothing? exit with default
  90.  
  91.                dec     di              ;back up to character found
  92.                inc     cx              ; "
  93.  
  94.                xor     ax,ax           ;will hold building linenum
  95.                jmps    enter_convert   ;convert string to binary
  96.  
  97. convert        mov     bx, 10          ;multiply running total by 10
  98.                mul     ax,bx
  99.                jo      bad_num         ;overflow?  error exit
  100. enter_convert  xor     bx,bx           ;clear out top half
  101.                mov     bl, [di]        ;get a digit into al
  102.                inc     di              ;bump pointer
  103.                cmp     bl, '0'         ;must be between 0
  104.                jb      bad_num
  105.                cmp     bl, '9'         ;and 9
  106.                ja      bad_num
  107.                sub     bl, '0'         ;convert to binary
  108.                add     ax, bx          ;add to running total
  109.                jo      bad_num         ;overflow? error exit
  110.                loop    convert
  111.  
  112.                mov     linenum, ax     ;store converted number
  113.                ret                     ;normal return
  114.  
  115. bad_num        mov     ah, @write      ;print error message
  116.                mov     bx, 2           ;on stderror
  117.                mov     cx, num_msg_end-num_msg
  118.                mov     dx, offset(num_msg)
  119.                int     21H             ;and use default
  120. b1             ret                     ;normal return
  121.  
  122. linenum        dw      1000            ;line number defaults to 1000
  123.  
  124.  
  125. num_msg        db      beep cr lf
  126.                db      'Invalid starting line number - Defaulting to 1000' cr lf
  127.                db      cr lf
  128. num_msg_end
  129.                endp
  130.  
  131. doit           proc    near            ;convert infile to data
  132.  
  133. do1            mov     ah, @read       ;read
  134.                mov     bx, stdin       ;from stdin
  135.                mov     cx, buf_length  ;one buffer's worth
  136.                mov     dx, offset(in_buf)
  137.                int     21H
  138.                test    ax, ax          ;test for EOF
  139.                jz      done            ;no bytes? done
  140.  
  141.                mov     cx, ax          ;cx <== # of bytes read
  142.                mov     si, offset(in_buf)
  143. do2            lodsb                   ;
  144.                call    output          ;convert and send to stdout
  145.                loop    do2             ;loop for # of bytes read
  146.                jmps    do1             ;then refill buffer
  147.  
  148. done           ret
  149.                endp
  150.  
  151. output         proc    near            ;convert byte in al to hex string
  152.                                        ;and send to stdout
  153.  
  154.                cmpw    cur_pos, offset(eol) ;is the line full?
  155.                jb      o1              ;no, skip
  156.                call    newline         ;yes, dump buffer
  157.  
  158. o1             call    send_byte       ;print hex value of byte
  159.                addw    cur_pos, 8      ;bump line positions used
  160.                ret                     ;and exit
  161.  
  162. cur_pos        dw      offset(first_hex) ;current position in line
  163.                endp
  164.  
  165.  
  166. newline        proc    near            ;starts a new data line
  167.  
  168.                push    ax              ;save state
  169.                push    bx              ; "
  170.                push    cx              ; "
  171.                push    dx              ; "
  172.                push    di              ; "
  173.  
  174.                mov     al, ' '         ;blank out old number
  175.                mov     di, offset(out_buf)
  176.                mov     cx, 5
  177.                rep
  178.                stosb
  179.  
  180.                mov    ax, linenum      ;print line number
  181.  
  182.                                        ;the following code fragment was written
  183.                                        ;by Bob Smith and published in PC Age
  184.                                        ;Volume 3.1 (Jan. '84) p. 116
  185.  
  186.                mov     bx, 10          ;set up divisor
  187.                xor     cx, cx          ;clear counter
  188. nxt_in         xor     dx, dx          ;clear for division
  189.                div     bx              ;dl <== AX mod 10
  190.                or      dl, '0'         ;convert to ascii digit
  191.                push    dx              ;save digit
  192.                inc     cx              ;bump counter
  193.                and     ax, ax          ;are we done?
  194.                jnz     nxt_in          ;nope, keep going
  195.                                        ;stack now has digits of number
  196.                                        ;end of Bob Smith's code
  197.  
  198.                mov     di, offset(out_buf) ;peel digits off stack
  199. nxt_out        pop     ax                  ;into number field
  200.                stosb
  201.                loop    nxt_out
  202.  
  203.                mov     ah, @prnstr      ;now print line
  204.                mov     dx, offset(out_buf)
  205.                int     21H
  206.  
  207.                movw    cur_pos, offset(first_hex)   ;reset pointer
  208.                addw    linenum, 10                  ;bump line number
  209.  
  210.                pop     di              ;restore state
  211.                pop     dx
  212.                pop     cx
  213.                pop     bx
  214.                pop     ax
  215.                ret                     ;and exit
  216.                endp
  217.  
  218. send_byte      proc    near            ;converts byte in AL to hex string
  219.                                        ;and stuffs it into output buffer
  220.  
  221.                push    bx
  222.                push    dx
  223.                push    ax
  224.  
  225.                mov     bx, offset(table)  ;point to xlat table
  226.  
  227.                and     al, 0F0H        ;mask off low nybble
  228.                shr     al
  229.                shr     al
  230.                shr     al
  231.                shr     al
  232.                xlat                    ;translate to hex string
  233.                mov     bp, cur_pos     ;and stuff it into buffer
  234.                mov     [bp], al
  235.  
  236.                pop     ax              ;recover character
  237.                and     al, 0FH         ;mask off high nybble
  238.                xlat                    ;translate low nybble to hex
  239.                mov     1[bp], al       ;and stuff it into buffer
  240.  
  241.                pop     dx
  242.                pop     bx
  243.                ret                     ;and return
  244.  
  245. table          db '0123456789ABCDEF'
  246.                endp
  247.  
  248. cleanup        proc    near            ;send out any partial line
  249.  
  250.                cmpw    cur_pos, offset(first_hex) ;any unprinted chars?
  251.                je      cexit                      ;no, exit
  252.  
  253.                mov     ah, @write
  254.                mov     bx, stdout
  255.                mov     cx, cur_pos
  256.                sub     cx, offset(out_buf)
  257.                sub     cx, 5
  258.                mov     dx, offset(out_buf)
  259.                int     21H
  260.                mov     ah, @prnstr
  261.                mov     dx, offset(eol)
  262.                int     21H
  263. cexit          ret
  264.                endp
  265.  
  266.  
  267.  
  268. out_buf        ds      5               ;5 digit line number
  269.                db      '  DATA'
  270.                db      '   &H'        ;8 hex bytes per line
  271. first_hex      db      '00' comma      ;first hex field
  272.                db      '   &H00' comma
  273.                db      '   &H00' comma
  274.                db      '   &H00' comma
  275.                db      '   &H00' comma
  276.                db      '   &H00' comma
  277.                db      '   &H00' comma
  278.                db      '   &H00'
  279. eol            db      cr lf '$'       ;end of output line
  280.  
  281. in_buf
  282.